package com.gxuwz.config;

import ch.qos.logback.core.db.DBHelper;
import com.gxuwz.bean.Car;
import com.gxuwz.bean.Pet;
import com.gxuwz.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

import java.util.logging.Handler;

/**
 *1.使用注解bean组件创建的组件默认是单实例的
 * 2.配置类本身也是组件
 * 3.proxyBeanMethods：代理bean的方法
 *      Full(proxyBeanMethods=true):无论外部调用@Bean多少次方法返回的组件都是但实例的
 *      (要去检查IOC容器中组件是否存在)
 *      Lite(proxyBeanMethods=false):调用@Bean多少次方法返回的组件都是新创建的
 *      应用:组件依赖
 *      最佳实战:
 *              ■ 配置 类组件之间无依赖关系用Lite模式加速容器启动过程，减少判断
 *              ■ 配置类组件之间有依赖关系，方法会被调用得到之前单实例组件，用Full模式
 *
 * @Import({User.class, Handler.class}):导入两个组件
 *
 * @ImportResource("classpath:beans.xml"):导入spring配置文件
 *
 *
 */
//@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true) //该注解标识类为配置类==配置文件
//条件装配
//@ConditionalOnBean(name = "tom")          //存在时进行
@ConditionalOnMissingBean(name = "tom") // 不存在时进行
@ImportResource("classpath:beans.xml")

@EnableConfigurationProperties(Car.class)

public class MyConfig {

    @Bean  //Bean注解注册组件，组件的id是方法名，返回的类型是组件的实例
    public User user01(){
        User user01 = new User("jack", 12);
        user01.setPet(pet());

        return user01;

    }

    @Bean("tom22") //也可以设置组件id为tom
    public Pet pet(){
        return new Pet("tomcat");
    }


}
